ウィジェットのテストの概要
の中に単体テストの概要レシピ、
を使用して Dart クラスをテストする方法を学習しました。test
パッケージ。
ウィジェット クラスをテストするには、flutter_test
Flutter SDK に同梱されているパッケージ。
のflutter_test
パッケージには次のツールが含まれています
ウィジェットのテスト:
- の
WidgetTester
構築と対話が可能 テスト環境でウィジェットを使用します。 - の
testWidgets()
自動的に機能する 新しいものを作成しますWidgetTester
テストケースごとに、 通常の代わりに使用されますtest()
関数。 - の
Finder
クラスによりウィジェットの検索が可能になります テスト環境で。 - ウィジェット固有の
Matcher
定数は検証に役立ちます かどうかFinder
ウィジェットを見つけるか、 テスト環境での複数のウィジェット。
これが圧倒的に聞こえるかもしれませんが、心配しないでください。これらすべての部品がどのように適合するかを学びましょう このレシピ全体を通して、次の手順を使用します。
- を追加します。
flutter_test
依存。 - テストするウィジェットを作成します。
- を作成します
testWidgets
テスト。 - を使用してウィジェットを構築します
WidgetTester
。 - を使用してウィジェットを検索します
Finder
。 - を使用してウィジェットを確認します
Matcher
。
flutter_test
依存
1.テストを作成する前に、flutter_test
の依存関係dev_dependencies
のセクションpubspec.yaml
ファイル。
コマンドラインツールを使用して新しい Flutter プロジェクトを作成する場合、または
コード エディターの場合、この依存関係はすでに設定されているはずです。
dev_dependencies:
flutter_test:
sdk: flutter
2. テストするウィジェットを作成する
次に、テスト用のウィジェットを作成します。このレシピに関しては、
を表示するウィジェットを作成するtitle
とmessage
。
class MyWidget extends StatelessWidget {
const MyWidget({
super.key,
required this.title,
required this.message,
});
final String title;
final String message;
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Text(message),
),
),
);
}
}
testWidgets
テスト
3.テストするウィジェットを使用して、最初のテストを作成することから始めます。
使用testWidgets()
によって提供される機能flutter_test
テストを定義するパッケージ。
のtestWidgets
関数を使用すると、
ウィジェットをテストして作成しますWidgetTester
一緒に仕事をする。
このテストは次のことを検証しますMyWidget
指定されたタイトルとメッセージを表示します。
それに応じてタイトルが付けられており、次のセクションで説明します。
void main() {
// Define a test. The TestWidgets function also provides a WidgetTester
// to work with. The WidgetTester allows you to build and interact
// with widgets in the test environment.
testWidgets('MyWidget has a title and message', (tester) async {
// Test code goes here.
});
}
WidgetTester
4. 次のコマンドを使用してウィジェットを構築します。次にビルドしますMyWidget
を使用してテスト環境内でpumpWidget()
によって提供されるメソッドWidgetTester
。
のpumpWidget
メソッドは、提供されたウィジェットを構築してレンダリングします。
を作成しますMyWidget
タイトルとして「T」を表示するインスタンス
メッセージとして「M」が表示されます。
void main() {
testWidgets('MyWidget has a title and message', (tester) async {
// Create the widget by telling the tester to build it.
await tester.pumpWidget(const MyWidget(title: 'T', message: 'M'));
});
}
Pump() メソッドに関する注意事項
最初の電話の後、pumpWidget()
、WidgetTester
提供します
同じウィジェットを再構築する追加の方法。これは次のような場合に便利です
と一緒に作業するStatefulWidget
またはアニメーション。
たとえば、ボタンをタップすると電話がかかります。setState()
ただし、Flutter はそうではありません
テスト環境でウィジェットを自動的に再構築します。
次のいずれかの方法を使用して、Flutter にウィジェットを再構築するように依頼します。
tester.pump(Duration duration)
- フレームをスケジュールし、ウィジェットの再構築をトリガーします。
もし
Duration
を指定すると、時計を次のように進めます。 その量を指定してフレームをスケジュールします。スケジュールは立てません 継続時間が 1 秒より長い場合でも、複数のフレーム シングルフレーム。
tester.pumpAndSettle()
- 繰り返し電話をかける
pump()
までの指定された期間で スケジュールされたフレームはもうありません。 これは基本的に、すべてのアニメーションが完了するのを待ちます。
これらのメソッドにより、ビルド ライフサイクルをきめ細かく制御できます。 これはテスト中に特に役立ちます。
Finder
5. を使用してウィジェットを検索します。テスト環境のウィジェットで検索
ウィジェット ツリーを介して、title
とmessage
を使用したテキスト ウィジェットFinder
。これにより、次のことが確認できます。
ウィジェットは正しく表示されています。
この目的のために、トップレベルのfind()
によって提供されるメソッドflutter_test
を作成するためのパッケージFinders
。
探しているのはわかっているので、Text
ウィジェットの場合は、find.text()
方法。
詳細については、Finder
クラスについては、を参照してください。ウィジェット テストでのウィジェットの検索レシピ。
void main() {
testWidgets('MyWidget has a title and message', (tester) async {
await tester.pumpWidget(const MyWidget(title: 'T', message: 'M'));
// Create the Finders.
final titleFinder = find.text('T');
final messageFinder = find.text('M');
});
}
Matcher
6. を使用してウィジェットを確認します。最後にタイトルとメッセージを確認しますText
ウィジェットが画面に表示される
を使用してMatcher
によって提供される定数flutter_test
。Matcher
クラスはその中核部分ですtest
パッケージ、
特定のデータを検証する一般的な方法を提供します
価値が期待に応えます。
ウィジェットが画面に 1 回だけ表示されるようにします。
この目的のために、findsOneWidget
Matcher
。
void main() {
testWidgets('MyWidget has a title and message', (tester) async {
await tester.pumpWidget(const MyWidget(title: 'T', message: 'M'));
final titleFinder = find.text('T');
final messageFinder = find.text('M');
// Use the `findsOneWidget` matcher provided by flutter_test to verify
// that the Text widgets appear exactly once in the widget tree.
expect(titleFinder, findsOneWidget);
expect(messageFinder, findsOneWidget);
});
}
追加のマッチャー
に加えてfindsOneWidget
、flutter_test
追加の機能を提供します
一般的なケースのマッチャー。
findsNothing
- ウィジェットが見つからないことを確認します。
findsWidgets
- 1 つ以上のウィジェットが見つかったことを確認します。
findsNWidgets
- 特定の数のウィジェットが見つかったことを確認します。
matchesGoldenFile
- ウィジェットのレンダリングが特定のビットマップ画像と一致することを検証します (「ゴールデン ファイル」テスト)。
完全な例
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
// Define a test. The TestWidgets function also provides a WidgetTester
// to work with. The WidgetTester allows building and interacting
// with widgets in the test environment.
testWidgets('MyWidget has a title and message', (tester) async {
// Create the widget by telling the tester to build it.
await tester.pumpWidget(const MyWidget(title: 'T', message: 'M'));
// Create the Finders.
final titleFinder = find.text('T');
final messageFinder = find.text('M');
// Use the `findsOneWidget` matcher provided by flutter_test to
// verify that the Text widgets appear exactly once in the widget tree.
expect(titleFinder, findsOneWidget);
expect(messageFinder, findsOneWidget);
});
}
class MyWidget extends StatelessWidget {
const MyWidget({
super.key,
required this.title,
required this.message,
});
final String title;
final String message;
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Text(message),
),
),
);
}
}